/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.jomijushi.fid.servicios;

import com.jomijushi.fid.dao.PersonaEmpresaImplementsDAO;
import com.jomijushi.fid.dao.PersonaEmpresaInterfazDAO;
import com.jomijushi.fid.dao.RolTrabajadorHasFidTrabajadorImplementsDAO;
import com.jomijushi.fid.dao.RolTrabajadorHasFidTrabajadorInterfazDAO;
import com.jomijushi.fid.dominio.FidPersonaEmpresa;
import com.jomijushi.fid.dominio.FidRolTrabajador;
import com.jomijushi.fid.dominio.FidRolTrabajadorHasFidTrabajador;
import com.jomijushi.fid.dominio.FidTrabajador;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;


/**
 *
 * @author Jorge Valverde Rebaza
 */
public class PersonaEmpresaImplementsService  extends JpaService<Integer, FidPersonaEmpresa> implements PersonaEmpresaInterfazService{

    private RolTrabajadorHasFidTrabajadorInterfazDAO rolesDAO = new RolTrabajadorHasFidTrabajadorImplementsDAO();
    private PersonaEmpresaInterfazDAO personaDAO = new PersonaEmpresaImplementsDAO();

    

    // Esta Metodo por los parametros podemos deducir que es registrar de FidTrabajado con sus roles
    public void registrar(FidTrabajador trabajador, List<FidRolTrabajador> lstRoles) {
       EntityManager em = emf.createEntityManager();
       em.getTransaction().begin();
       personaDAO.setEntityManager(em);
       rolesDAO.setEntityManager(em);
       FidRolTrabajadorHasFidTrabajador rolToTrabajador;
       try{ // Si algo que esta dentro de este try catch no se procesa bien rollback y ninguno de los dos se ejecuta
            personaDAO.persist(trabajador);
            for(int i=0;i<lstRoles.size();i++)
            {
                System.out.println("id del rol = "+lstRoles.get(i).getId());
                rolToTrabajador = new FidRolTrabajadorHasFidTrabajador();
                rolToTrabajador.setFidRolTrabajadorId(lstRoles.get(i));
                rolToTrabajador.setFidTrabajadorFidPersonaEmpresaId(trabajador);
                rolesDAO.persist(rolToTrabajador);
            }
            em.getTransaction().commit();
       }
       catch(Exception e){            
            System.out.println("Service Error: ocurrido al agregar roles a un trabajador");
            System.out.println("Causado por:\n"+e.getCause().toString());
            em.getTransaction().rollback();
        }
        finally{
            em.close();
        }
    }


    

    // Este metodo por los parametros saremos que es actualizar para FidTrabajador
    public void actualizar(FidTrabajador trabajador, List<FidRolTrabajador> lstNuevosRoles) {       
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        personaDAO.setEntityManager(em);
        rolesDAO.setEntityManager(em);
        FidRolTrabajadorHasFidTrabajador rolToTrabajador;
        try{
            // Actualizamos
            personaDAO.merge(trabajador);
            //eliminamos los roles antiguos
            rolesDAO.eliminarRolesTrabajador(trabajador);
            //eliminarRolesTrabajador(trabajador);
            // Agregamos los nuevos
            for(int i=0;i<lstNuevosRoles.size();i++)
            {
                System.out.println("id del rol = "+lstNuevosRoles.get(i).getId());
                rolToTrabajador = new FidRolTrabajadorHasFidTrabajador();
                rolToTrabajador.setFidRolTrabajadorId(lstNuevosRoles.get(i));
                rolToTrabajador.setFidTrabajadorFidPersonaEmpresaId(trabajador);
                rolesDAO.persist(rolToTrabajador);
            }
            em.getTransaction().commit();
        }catch(Exception e){
            em.getTransaction().rollback();
        }

    }

    public void eliminar(FidTrabajador trabajador, List<FidRolTrabajador> lstNuevosRoles)
    {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        personaDAO.setEntityManager(em);
        rolesDAO.setEntityManager(em);
        try{
            rolesDAO.eliminarRolesTrabajador(trabajador);
            personaDAO.remove(trabajador);
            em.getTransaction().commit();
        }catch(Exception e)
        {
            em.getTransaction().rollback();
        }
        finally{
            em.close();
        }
    }
    
    public List<FidRolTrabajador> listarRolesTrabajador(int id) {
        EntityManager em = emf.createEntityManager();
        personaDAO.setEntityManager(em);
        List<FidRolTrabajador>lstRoles = new ArrayList<FidRolTrabajador>();
        try{
            lstRoles = personaDAO.listarRolesTrabajador(id);
        }
        catch(Exception e){
            System.out.println("Service Error: ocurrido al listar roles de trabajador");
            System.out.println("Causado por:\n"+e.getCause().toString());
        }

        return lstRoles;
    }

    
 
}
